from django.db import models
from django.utils.text import slugify
import uuid

class Subject(models.Model):
    name = models.CharField(max_length=100, verbose_name="学科名称")
    # key = models.CharField(max_length=100, verbose_name="key")
    key = models.CharField(max_length=100, unique=True, verbose_name="学科关键字")  # 已有唯一性约束
    parent = models.ForeignKey('self', on_delete=models.CASCADE, related_name='children', blank=True, null=True, verbose_name="父级学科")
    type = models.IntegerField(choices=[(1, '一级类目'), (2, '二级类目'), (3, '三级类目（文章）'), (4, '三级类目（试卷）'), (5, '三级类目（随机出题）')], default=1, verbose_name="学科层级")

    def save(self, *args, **kwargs):
        if not self.key:  # 仅当未手动设置 key 时触发自动生成
            # 步骤1：基于 name 生成基础 key（英文格式）
            base_key = slugify(self.name)
            # 步骤2：处理空值（name 含特殊字符时，用 UUID 生成唯一前缀）
            if not base_key:
                base_key = f"subject-{uuid.uuid4().hex[:8]}"
            # 步骤3：限制基础 key 长度（预留后缀空间）
            base_key = base_key[:90]
            # 步骤4：循环检查唯一性，添加后缀（如 -1、-2）
            unique_key = base_key
            counter = 1
            max_attempts = 100
            while Subject.objects.filter(key=unique_key).exists() and counter <= max_attempts:
                suffix_length = len(str(counter)) + 1  # 后缀长度（如 "-1" 占2字符）
                base_key = base_key[:100 - suffix_length]  # 动态调整基础 key 长度
                unique_key = f"{base_key}-{counter}"
                counter += 1
            # 步骤5：超次数提示手动设置（极低概率）
            if counter > max_attempts:
                raise ValueError(f"无法自动生成唯一 key，请手动设置（基础 key：{base_key}）")
            self.key = unique_key
        super().save(*args, **kwargs)

    class Meta:
        verbose_name = "学科"
        verbose_name_plural = verbose_name
        db_table = 't_subject'